<?php

// **********************************************
// | Name：星空框架  自定义攻击拦截过滤
// **********************************************
// | Version: V5.0
// **********************************************
// | Author: xkyinzhe <zhonghuaxinxing@sina.cn>
// **********************************************
// | City: 青岛
// **********************************************
// | Time：2022-04-08
// **********************************************
declare(strict_types=1);

namespace app\middleware;

use think\Request;

/**
 * @xk 自定义攻击拦截
 */
class CheckParam
{
    use \app\common\traits\Jump;
    /**
     * @xk 参数校验是否具备攻击性
     * @method          handle
     * @param           Request $request  [description]
     * @param           Closure $next  [description]
     * @return          [type] [description]
     * @Version：V5.0
     * @Author：xkyinzhe <zhonghuaxinxing@sina.cn>
     * @City：           青岛
     * @Time：2022-04-08
     */
    public function handle(Request $request, \Closure $next)
    {
        $param = $request->param(); // 得到全部参数
        if ($param) {
            try {
                self::CheckParam($param);
            } catch (\Exception $e) {
                $this->result(200, '数据请求成功', $e->getCode(), $e->getMessage());
            }
        }
        return $next($request);
    }
    /**
     * @xk 进入过滤程序 进行拆分请求数据
     *
     * @Version: V1.0
     * @Author: xkyinzhe <zhonghuaxinxing@sina.cn>
     * @City: 青岛
     * @Time 2024-03-05
     * @param array $param
     * @return void
     */
    public function CheckParam($param = [])
    {
        if (is_array($param)) {
            foreach ($param as $key => $value) {
                if (is_array($value)) {
                    $this->CheckParam($value);
                } else {
                    $this->checkStr((string)$value);
                }
                $this->checkStr((string)$key);
            }
        } else {
            $this->checkStr((string)$param);
        }
    }
    /**
     * @xk 单独校验每个字符串是否存在异常参数
     *
     * @Version: V1.0
     * @Author: xkyinzhe <zhonghuaxinxing@sina.cn>
     * @City: 青岛
     * @Time 2024-03-05
     * @param [type] $param
     * @return void
     */
    public function checkStr($param)
    {
        $pregs = '#select|insert|update|CR|document|LF|eval|delete|script|alert|union|into|load_file|outfile|<?php*|<script*|iframe|script|body|layer|base|object|input#';
        $out_array = ['item_select','unionid'];
        if (!in_array($param,$out_array) && preg_match($pregs, (string)$param) == 1) {
            throw new \think\Exception("请求参数不合法，请重新尝试", 404);
        }
    }
}
